/******************************************************************************
 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

#ifndef _LINUX_IF_ETHER_H
#define _LINUX_IF_ETHER_H

/*
 *	IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
 *	and FCS/CRC (frame check sequence).
 */

#define ETH_ALEN 6		   /* Octets in one ethernet addr	 */
#define ETH_HLEN 14		   /* Total octets in header.	 */
#define ETH_ZLEN 60		   /* Min. octets in frame sans FCS */
#define ETH_DATA_LEN 1500  /* Max. octets in payload	 */
#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */

/*
 *	These are the defined Ethernet Protocol ID's.
 */

#define ETH_P_LOOP 0x0060	  /* Ethernet Loopback packet	*/
#define ETH_P_PUP 0x0200	   /* Xerox PUP packet		*/
#define ETH_P_PUPAT 0x0201	 /* Xerox PUP Addr Trans packet	*/
#define ETH_P_IP 0x0800		   /* Internet Protocol packet	*/
#define ETH_P_X25 0x0805	   /* CCITT X.25			*/
#define ETH_P_ARP 0x0806	   /* Address Resolution packet	*/
#define ETH_P_BPQ 0x08FF	   /* G8BPQ AX.25 Ethernet Packet	[ NOT AN OFFICIALLY REGISTERED ID ] */
#define ETH_P_IEEEPUP 0x0a00   /* Xerox IEEE802.3 PUP packet */
#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */
#define ETH_P_DEC 0x6000	   /* DEC Assigned proto           */
#define ETH_P_DNA_DL 0x6001	/* DEC DNA Dump/Load            */
#define ETH_P_DNA_RC 0x6002	/* DEC DNA Remote Console       */
#define ETH_P_DNA_RT 0x6003	/* DEC DNA Routing              */
#define ETH_P_LAT 0x6004	   /* DEC LAT                      */
#define ETH_P_DIAG 0x6005	  /* DEC Diagnostics              */
#define ETH_P_CUST 0x6006	  /* DEC Customer use             */
#define ETH_P_SCA 0x6007	   /* DEC Systems Comms Arch       */
#define ETH_P_RARP 0x8035	  /* Reverse Addr Res packet	*/
#define ETH_P_ATALK 0x809B	 /* Appletalk DDP		*/
#define ETH_P_AARP 0x80F3	  /* Appletalk AARP		*/
#define ETH_P_8021Q 0x8100	 /* 802.1Q VLAN Extended Header  */
#define ETH_P_IPX 0x8137	   /* IPX over DIX			*/
#define ETH_P_IPV6 0x86DD	  /* IPv6 over bluebook		*/
#define ETH_P_PPP_DISC 0x8863  /* PPPoE discovery messages     */
#define ETH_P_PPP_SES 0x8864   /* PPPoE session messages	*/
#define ETH_P_ATMMPOA 0x884c   /* MultiProtocol Over ATM	*/
#define ETH_P_ATMFATE 0x8884   /* Frame-based ATM Transport \
				* over Ethernet                             \
				*/

/*
 *	Non DIX types. Won't clash for 1500 types.
 */

#define ETH_P_802_3 0x0001	 /* Dummy type for 802.3 frames  */
#define ETH_P_AX25 0x0002	  /* Dummy protocol id for AX.25  */
#define ETH_P_ALL 0x0003	   /* Every packet (be careful!!!) */
#define ETH_P_802_2 0x0004	 /* 802.2 frames */
#define ETH_P_SNAP 0x0005	  /* Internal only		*/
#define ETH_P_DDCMP 0x0006	 /* DEC DDCMP: Internal only     */
#define ETH_P_WAN_PPP 0x0007   /* Dummy type for WAN PPP frames*/
#define ETH_P_PPP_MP 0x0008	/* Dummy type for PPP MP frames */
#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
#define ETH_P_PPPTALK 0x0010   /* Dummy type for Atalk over PPP*/
#define ETH_P_TR_802_2 0x0011  /* 802.2 frames */
#define ETH_P_MOBITEX 0x0015   /* Mobitex (kaz@cafe.net)	*/
#define ETH_P_CONTROL 0x0016   /* Card specific control frames */
#define ETH_P_IRDA 0x0017	  /* Linux-IrDA			*/
#define ETH_P_ECONET 0x0018	/* Acorn Econet			*/

/*
 *	This is an Ethernet frame header.
 */
//CONFIG_MEMORY_ACCESS_ALIGNED for 4byte aligned,ethdhr size is 16,leading error in wlanhdr_to_ethdr
RTW_PACK_STRUCT_BEGIN
struct ethhdr {
	unsigned char h_dest[ETH_ALEN];   /* destination eth addr	*/
	unsigned char h_source[ETH_ALEN]; /* source ether addr	*/
	unsigned short h_proto;			  /* packet type ID field	*/
} RTW_PACK_STRUCT_STRUCT;
RTW_PACK_STRUCT_END

struct _vlan {
	unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID
	unsigned short h_vlan_encapsulated_proto;
};

#define get_vlan_id(pvlan) ((_htons((unsigned short)pvlan->h_vlan_TCI)) & 0xfff)
#define get_vlan_priority(pvlan) ((_htons((unsigned short)pvlan->h_vlan_TCI)) >> 13)
#define get_vlan_encap_proto(pvlan) (_htons((unsigned short)pvlan->h_vlan_encapsulated_proto))

#endif /* _LINUX_IF_ETHER_H */
